PHP7.2が使えるLambdaのカスタムランタイム環境を作ってみた #reinvent
はじめに
サーバーレス開発部@大阪の岩田です。 re:Invent2018の発表直後からLambdaの実行環境としてPHPのCustom Runtimeが選択できるようになりました。
【アップデート】 もう言語で悩まない!AWS LambdaでCustom Runtimeが利用できるようになりました! #reinvent
しかし、このStackery社から提供されているCustom RuntimeのPHPはバージョンが7.1となっています。 Stackery社のCustom Runtimeを参考にPHP7.2のCustom Runtimeを作成してみたので、手順についてご紹介します。
手順
PHP7.2用のビルド環境構築
まずはStackery社のリボジトリをcloneします。
git clone https://github.com/stackery/php-lambda-layer.git
cloneできたら下記の通りファイルを修正します。
bootstrap
- exec("php -S localhost:8000 -c /var/task/php.ini -d extension_dir=/opt/lib/php/7.1/modules '$HANDLER'"); + exec("php -S localhost:8000 -c /var/task/php.ini -d extension_dir=/opt/lib/php/7.2/modules '$HANDLER'");
Makefile
-php71.zip: +php72.zip: docker run --rm -v $(ROOT_DIR):/opt/layer lambci/lambda:build-nodejs8.10 /opt/layer/build.sh -upload: php71.zip +upload: php72.zip ./upload.sh -publish: php71.zip +publish: php72.zip ./publish.sh clean: - rm php71.zip + rm php72.zip
php.ini
-extension_dir=/opt/lib/php/7.1/modules +extension_dir=/opt/lib/php/7.2/modules
build.sh
このファイルは変更箇所が多いのでdiffではなくファイルの中身丸々記載します。 PHP7.2がyumでは導入できないのでソースからコンパイルしています。
#!/bin/bash yum install -y libxml2-devel libcurl-devel curl -fsSl 'http://jp2.php.net/distributions/php-7.2.12.tar.gz' -o php-7.2.12.tar.gz mkdir -p php-7.2.12 tar -xf php-7.2.12.tar.gz -C php-7.2.12 --strip-components=1 cd php-7.2.12 ./configure \ --enable-pcntl \ --enable-json=shared \ --with-curl=shared make make install cd ext for ext in json curl do cd $ext phpize ./configure make make install cd .. done mkdir /tmp/layer cd /tmp/layer cp /opt/layer/bootstrap . cp /opt/layer/php.ini . mkdir bin cp /usr/local/bin/php bin/ mkdir lib for lib in libncurses.so.5 libtinfo.so.5 libpcre.so.0; do cp "/lib64/${lib}" lib/ done mkdir -p lib/php/7.2/modules/ cp -a /usr/local/lib/php/extensions/no-debug-non-zts-20170718/* lib/php/7.2/modules/ cp /usr/lib64/libedit.so.0 lib/php/7.2/modules/ zip -r /opt/layer/php72.zip .
ビルド
ファイルが修正できたらビルドします。
make php72.zip
レイヤーの作成
ビルドが完了するとphp72.zipというファイルが出力されます。 このzipファイルをアップロードしてphp7.2のレイヤーを作成します。
PHPのLambdaを作成、デプロイ
PHP7.2のレイヤーが作成できたらphpinfoを実行するLambdaのコードをデプロイします。 デプロイの際に、レイヤーとして先ほど作成したPHP7.2のレイヤーを指定します。
AWSTemplateFormatVersion: 2010-09-09 Description: My PHP Application Transform: AWS::Serverless-2016-10-31 Resources: phpserver: Type: AWS::Serverless::Function Properties: FunctionName: !Sub ${AWS::StackName}-phpserver Description: PHP Webserver CodeUri: src/php Runtime: provided Handler: index.php MemorySize: 3008 Timeout: 30 Tracing: Active Layers: <先ほど作成したPHP7.2のレイヤーのarn> Events: api: Type: Api Properties: Path: /{proxy+} Method: ANY
手順は下記のブログを参照して下さい。
本番環境のLambdaをステップ実行!! Lambdaのカスタムランタイム環境(PHP用)にExtensionを組み込んでみた #reinvent
確認してみる
デプロイできたらAPI GWのエンドポイントにアクセスし、phpinfoの出力結果を確認します。
無事にPHP7.2で動作しています!!
まとめ
PHP7.2のカスタムランタイムの構築方法についてご紹介しました。 未確認ですが、他のバージョンのPHPで構築する場合もほぼ同様の手順で構築できるかと思います。
PHP愛好家の皆様のお役に立てば幸いです。